const { logger } = require("../../logger");
const Product = require("../model/product.model");
const errorType = require("../constans/error-types");
const sequelize = require("../app/database");
const { authParams, authParamsBody } = require("../utils/auth-params");
const { Op } = require("sequelize");

class productController {
  async create(ctx, next) {
    authParamsBody(ctx.request.body);
    await Product.create(ctx.request.body)
      .then((res) => {
        ctx.success(res);
      })
      .catch((err) => {
        ctx.fail();
        logger.error(err);
      });
  }

  async detail(ctx, next) {
    try {
      const { productId } = ctx.params;
      if (!productId) {
        const error = new Error(errorType.NOPARAMETER);
        return ctx.app.emit("error", error, ctx);
      }
      // 修改阅读量
      await Product.update(
        { product_reads: sequelize.literal("product_reads+1") },
        {
          where: { id: productId },
        }
      );
      // 商品详情
      await Product.findOne({
        where: { id: productId },
        raw: true,
      })
        .then((res) => {
          ctx.success(res);
        })
        .catch((err) => {
          ctx.fail(99);
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async list(ctx, next) {
    try {
      const { limit, offset, keyword } = ctx.query;
      if (!limit || !offset) {
        const error = new Error(errorType.NOPARAMETER);
        return ctx.app.emit("error", error, ctx);
      }
      await Product.findAndCountAll({
        where: {
          product_name: {
            [Op.like]: `%${keyword}%`,
          },
        },
        limit: parseInt(limit),
        offset: parseInt(limit) * parseInt(offset - 1),
      })
        .then((res) => {
          ctx.success({
            list: res.rows,
            total: res.count,
            limit,
            offset,
          });
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async update(ctx, next) {
    try {
      const { productId } = ctx.params;
      const {
        product_name,
        product_price,
        product_image,
        product_summary,
        product_type,
      } = ctx.request.body;
      await Product.update(
        {
          product_name,
          product_price,
          product_image,
          product_summary,
          product_type,
        },
        {
          where: {
            id: productId,
          },
        }
      )
        .then((res) => {
          res[0] ? ctx.success() : ctx.fail();
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  async remove(ctx, next) {
    try {
      const { productId } = ctx.params;
      await Product.destroy({
        where: {
          id: productId,
        },
      })
        .then((res) => {
          // 这样判断好像不太合理
          res ? ctx.success() : ctx.fail();
        })
        .catch((err) => {
          ctx.fail();
          console.log(err);
        });
    } catch (error) {
      logger.error(error);
      console.log(error);
    }
  }

  // 修改商品类型
  async productType(ctx, next) {
    const { type, id } = ctx.request.body;
    await Product.update(
      { product_type: type },
      {
        where: { id },
        raw: true,
      }
    )
      .then((res) => {
        ctx.success();
      })
      .catch((err) => {
        ctx.fail(99);
        logger.error(err);
      });
  }
}

module.exports = new productController();
